import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

/**
 * 用户状态管理
 * 管理用户登录状态、用户信息、token等
 */
export const useUserStore = defineStore('user', () => {
  // 状态
  const isLoggedIn = ref(false)
  const userInfo = ref(null)
  const userId = ref(null)
  const token = ref('')
  const openid = ref('')
  const isLoading = ref(false)

  // 计算属性
  const isAuthenticated = computed(() => {
    return isLoggedIn.value && !!token.value && !!userId.value
  })

  const currentUser = computed(() => {
    return {
      userId: userId.value,
      userInfo: userInfo.value,
      token: token.value,
      openid: openid.value
    }
  })

  // 方法
  /**
   * 设置用户登录状态
   */
  const setLoginStatus = (status) => {
    isLoggedIn.value = status
  }

  /**
   * 设置用户信息
   */
  const setUserInfo = (info) => {
    userInfo.value = info
  }

  /**
   * 设置用户ID
   */
  const setUserId = (id) => {
    userId.value = id
  }

  /**
   * 设置token
   */
  const setToken = (newToken) => {
    token.value = newToken
  }

  /**
   * 设置openid
   */
  const setOpenid = (id) => {
    openid.value = id
  }

  /**
   * 设置加载状态
   */
  const setLoading = (loading) => {
    isLoading.value = loading
  }

  /**
   * 登录 - 设置所有用户相关状态
   */
  const login = async (loginData) => {
    try {
      setLoading(true)
      
      const { userInfo: info, token: newToken, userId: id, openid: oid } = loginData
      
      setUserInfo(info)
      setToken(newToken)
      setUserId(id)
      setOpenid(oid)
      setLoginStatus(true)

      // 保存到本地存储
      if (typeof tt !== 'undefined') {
        tt.setStorageSync('token', newToken)
        tt.setStorageSync('userId', id)
        tt.setStorageSync('openid', oid)
        if (info) {
          tt.setStorageSync('userInfo', info)
        }
      }

      console.log('用户登录成功:', { userId: id, token: newToken })
      return true
    } catch (error) {
      console.error('登录失败:', error)
      return false
    } finally {
      setLoading(false)
    }
  }

  /**
   * 登出 - 清除所有用户状态
   */
  const logout = () => {
    setLoginStatus(false)
    setUserInfo(null)
    setUserId(null)
    setToken('')
    setOpenid('')

    // 清除本地存储
    if (typeof tt !== 'undefined') {
      tt.removeStorageSync('token')
      tt.removeStorageSync('userId')
      tt.removeStorageSync('openid')
      tt.removeStorageSync('userInfo')
    }

    console.log('用户已登出')
  }

  /**
   * 从本地存储恢复用户状态
   */
  const restoreFromStorage = () => {
    if (typeof tt === 'undefined') {
      console.log('不在小程序环境中，跳过状态恢复')
      return false
    }

    try {
      const storedToken = tt.getStorageSync('token')
      const storedUserId = tt.getStorageSync('userId')
      const storedOpenid = tt.getStorageSync('openid')
      const storedUserInfo = tt.getStorageSync('userInfo')

      // 检查是否有有效的登录信息
      const demoToken = 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTgxMjYzMTIsInVzZXJJZCI6MX0.giBiY8zzt0pK6aOe8HdNxvEZegAf2xdiC77Ux-j3z6c'
      const validToken = storedToken && storedToken !== demoToken

      if (validToken && storedUserId && storedOpenid) {
        setToken(storedToken)
        setUserId(storedUserId)
        setOpenid(storedOpenid)
        setUserInfo(storedUserInfo)
        setLoginStatus(true)
        
        console.log('从本地存储恢复用户状态成功')
        return true
      } else {
        // 清除无效的存储数据
        if (storedToken && !validToken) {
          tt.removeStorageSync('token')
        }
        console.log('本地存储中没有有效的用户状态')
        return false
      }
    } catch (error) {
      console.error('恢复用户状态失败:', error)
      return false
    }
  }

  /**
   * 检查登录状态
   */
  const checkLoginStatus = () => {
    return restoreFromStorage()
  }

  /**
   * 获取当前用户ID（兼容原有代码）
   */
  const getCurrentUserId = () => {
    return userId.value || (typeof tt !== 'undefined' ? tt.getStorageSync('userId') : null)
  }

  return {
    // 状态
    isLoggedIn,
    userInfo,
    userId,
    token,
    openid,
    isLoading,
    
    // 计算属性
    isAuthenticated,
    currentUser,
    
    // 方法
    setLoginStatus,
    setUserInfo,
    setUserId,
    setToken,
    setOpenid,
    setLoading,
    login,
    logout,
    restoreFromStorage,
    checkLoginStatus,
    getCurrentUserId
  }
})
